const logInfo = require('../../util/logInfo');
const logStep = require('../../util/logStep');
const path = require("path");
const { installDeps } = require("./utils/installDeps");
const { loadModule } = require("./utils/modules");
const invoke = require("./invoke");
const { option } = require("commander");
module.exports = async function add(
  pluginName,
  pluginOption = {},
  context = process.cwd()
) {
  //因为正常执行这个命令会再项目目录下，这里测试要主动加上项目目录
  context = path.join(context, "test-apps", "app-name");
  logStep(`1. 执行新增插件操作：[plugin:${pluginName}]-[context:${context}]`);
  logStep("1.1 判断是否是 /router, 如果是，则执行router 的操作");
  if (/^(@vue\/)?router$/.test(pluginName)) {
    return addRouter(context);
  }
  logStep("1.1 判断是否是 vuex， 如果是，则执行 vuex 的操作");
  if (/^(@vue\/)?vuex$/.test(pluginName)) {
    return addVuex(context);
  }

  logInfo(
    "为什么只需要单独执行这两个插件呢？ 因为这两个时再 vue-cli-service 里的，所以要单独执行一下，再后续的版本中，这两个也拆开成独立的插件了，也可以单独用了。会走下面的统一流程"
  );

  logStep(
    "2.1 调用 npm 安装新的插件，这调用的安装方法和 creator 里用的时同一个方法"
  );
  await installDeps(context, "npm", pluginName);
  logStep("2.2 获取改插件，并组装 generator 需要的参数");
  const apply = loadModule(pluginName + "/generator", context);
  logStep("2.3 调用 invoke 执行插入操作");
  invoke(pluginName, pluginOption, context);
};

async function addRouter(context) {
  logStep("1.1.1 router 选择使用什么路由模式");
  const options = { routerHistoryMode: true };
  logStep("1.1.2 组装完整参数，invoke 执行安装过程");
  logInfo("这里的参数组装和 create 里 调用 generator 时组装的参数一致，");
  logInfo(
    `${JSON.stringify({
      context,
      options: {
        id: "core:router",
        apply: "@vue/cli-service/generator/router",
        options,
      },
    })}`
  );
  const apply = loadModule("@vue/cli-service/generator/router", context);
  invoke.runGenerator(context, {
    id: "core:router",
    apply: loadModule("@vue/cli-service/generator/router", context),
    options,
  });
}

async function addVuex(context) {
  logStep("1.2.1  组装 vuex 的核心参数");
  invoke.runGenerator(context, {
    id: "core:vuex",
    apply: loadModule("@vue/cli-service/generator/vuex", context),
  });
}
